package com.itheima.dynamicarrays;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

/**
 * 动态数组
 */
public class DynamicArray implements Iterable<Integer> {
    private int size = 0;   //逻辑大小
    private int capacity = 8;   //容量
    private int[] array = new int[capacity];

    /**
     * 在末尾添加
     *
     * @param element
     */
    public void addLast(int element) {
        /*array[size] = element;
        size++;*/
        add(size, element);
    }

    /**
     * 在指定范围添加
     *
     * @param index
     * @param element
     */
    public void add(int index, int element) {
        /*if (index >= 0 && index < size) {
            System.arraycopy(array, index,
                    array, index + 1, size - index);
            array[index] = element;
            size++;
        }else if (index == size){
            array[index] = element;
            size++;
        }*/
        if (index >= 0 && index < size) {
            System.arraycopy(array, index,
                    array, index + 1, size - index);
        }
        array[index] = element;
        size++;
    }

    /**
     * 获取指定索引上的值
     *
     * @param index
     * @return
     */
    public int get(int index) { //[0...size)
        if (index >= 0 && index < size) {
            return array[index];
        }
        return -1;
    }


    /**
     * 遍历数组
     *
     * @param consumer
     */
    public void foreach(Consumer<Integer> consumer) {
        for (int i = 0; i < size; i++) {
            //System.out.println(array[i]);
            // 提供array[i]
            // 返回 void
            consumer.accept(array[i]);
        }
    }


    @Override
    public String toString() {
        return "DynamicArray{" +
                "size=" + size +
                ", capacity=" + capacity +
                ", array=" + Arrays.toString(array) +
                '}';
    }

    /**
     * 迭代器遍历
     *
     * @return
     */
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            //定义一个变量i用来记录当前元素索引
            int i = 0;

            @Override
            public boolean hasNext() {  // 有没有下一个元素
                return i < size;
            }

            @Override
            public Integer next() {  //返回当前元素,并移动到下一个元素
                return array[i++];
            }
        };
    }

    /**
     * stream流遍历
     *
     * @return
     */
    public IntStream stream() {
        return IntStream.of(Arrays.copyOfRange(array, 0, size));
    }

    /**
     * 删除元素
     *
     * @param index
     * @return
     */
    public int remove(int index) {
        int removed = array[index];
        if (index < size - 1) {
            System.arraycopy(array, index + 1,
                    array, index, size - index - 1);
        }
        size--;
        return removed;
    }
}
